package bancosys.tec.persist.entities.domain;

import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import jmine.tec.persist.annotation.Alias;
import jmine.tec.persist.annotation.Comment;
import jmine.tec.persist.annotation.Comments;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.CollectionOfElements;
import org.hibernate.annotations.ForeignKey;

import bancosys.tec.persist.authorization.annotation.DisplayName;

/**
 * @author piercio
 */
@Entity
@Table(name = "PAI_COM_EMBEDDABLE")
@Comments({ @Comment(table = "PAI_COM_EMBEDDABLE", value = "SEM COMENTARIOS."),
        @Comment(table = "PAI_COM_EMBEDDABLE", column = "ID", value = "SEM COMENTARIOS.") })
@Alias("PAICEM")
@DisplayName("Pai com Embeddable (BO p/ UnitTest)")
public class PaiComEmbeddable extends Filho {

    private Collection<EmbeddedItem> valores;

    private EmbeddedItem valor;

    private Filho filho;

    /**
     * @return a coleção de Valores.
     */
    @CollectionOfElements(fetch = FetchType.LAZY)
    @JoinTable(name = "PAI_COM_EMBEDDABLE_VALORES", joinColumns = @JoinColumn(name = "COD_PAI_COM_EMBEDDABLE"))
    @Comments({ @Comment(table = "PAI_COM_EMBEDDABLE_VALORES", value = "SEM COMENTARIOS."),
            @Comment(table = "PAI_COM_EMBEDDABLE_VALORES", column = "VALOR", value = "SEM COMENTARIOS."),
            @Comment(table = "PAI_COM_EMBEDDABLE_VALORES", column = "NOME", value = "SEM COMENTARIOS."),
            @Comment(table = "PAI_COM_EMBEDDABLE_VALORES", column = "COD_PAI_COM_EMBEDDABLE", value = "SEM COMENTARIOS.") })
    @Alias("PCEVAL")
    @Cascade({ org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
    public Collection<EmbeddedItem> getValores() {
        return this.valores;
    }

    /**
     * Define a coleção de Valores.
     * 
     * @param valores a coleção de Valores.
     */
    public void setValores(Collection<EmbeddedItem> valores) {
        this.valores = valores;
    }

    /**
     * Adiciona um novo Valor a coleção.
     * 
     * @param nome o nome do Valor.
     * @param valor o valor.
     * @param hash o hashCode do Valor.
     */
    public void addItem(EmbeddedItem valor) {
        if (this.valores == null) {
            this.valores = new ArrayList<EmbeddedItem>();
        }

        this.valores.add(valor);
    }

    public EmbeddedItem getValor() {
        return this.valor;
    }

    public void setValor(EmbeddedItem valor) {
        this.valor = valor;
    }

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "COD_FILHO_ONE_TO_ONE")
    @Comment(table = "PAI_COM_EMBEDDABLE", column = "COD_FILHO_ONE_TO_ONE", value = "SEM COMENTARIOS.")
    @Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    @ForeignKey(name = "FK_FILHO_PAICEM_1")
    public Filho getFilho() {
        return this.filho;
    }

    public void setFilho(Filho filho) {
        this.filho = filho;
    }

}
